const {
  freshToken
} = require('../api/refresh_token');
const {
  base_url
} = require('../utils/config');

//  封装请求
class HttpRequest {
  constructor(base_url = '') {
    this.base_url = base_url;
  }

  request(options = {}) {
    //	请求前对请求的参数进行处理
    if (!this.requestInterception(options)) return;

    //	请求内容
    return new Promise((resolve, reject) => {
      wx.request({
        ...options,
        success: (res) => {
          //  对响应回来的数据进行加工处理
          resolve(this.resopnseInterception(res))
        },
        fail: reject
      })
    })
  }

  //	get 请求
  async get(url, options) {
    options.url = url;
    options.method = 'GET';
    return await this.request(options)
  }
  //	post 请求
  async post(url, options) {
    options.url = url;
    options.method = 'POST';
    return await this.request(options)
  }

  //	请求拦截处理函数 - 处理 url、 header、 token 等
  requestInterception(options) {
    //	从 storage 里面获取 token， 如果 token 不存在，则返回授权页面，让用户进行重新授权
    const token = wx.getStorageSync('token');
    //	配置请求头
    options.header = {
      token
    }
    //	拼接请求的路径
    options.url = this.base_url + options.url;
    //	对请求的参数进行加工处理
    return true;
  }

  //	响应拦截处理函数  主要对返回的数据进行加工处理
  async resopnseInterception(data) {
    const _data = data;
    const {
      errors = [], status
    } = _data.data;

    //	判断是否过期， 过期就清空缓存
    if (errors[0] && errors[0].message === 'token过期') {
      console.log('清空数据');
      //  token 过期 直接清楚所有数据
      wx.clearStorageSync();
      //	跳转回登录页进行重新登录
      wx.redirectTo({
        url: '/pages/home/index'
      });
    }

    if (status === 500) {

      // wx.showToast({
      //   title: '网络异常',
      //   icon: 'error',
      //   duration: 1000
      // });

      //	重新刷新 token
      const {
        errors = [], token
      } = await freshToken();
      if (errors.length > 0) {
        return;
      }
      //	替换 token
      wx.setStorageSync('token', token);
    }

    return _data.data;
  }
}


exports.http = new HttpRequest(base_url);